
"""
CPU节点 - 处理CPU相关的异常指标
"""

import json
from typing import Dict, Any
from langchain_ollama import OllamaLLM
from Agent.utils.tools import cpu_tool_1,cpu_tool_2


# 调用本地大模型
llm = OllamaLLM(base_url="http://127.0.0.1:11434", model="deepseek-r1:7b")


def cpu_node(state: Dict[str, Any]) -> Dict[str, Any]:
    """CPU节点：处理CPU相关的异常指标"""
    print("进入cpu_node")

    current_solution = state.get("current_solution", {})
    if not current_solution:
        print("没有接收到解决方案")
        return {"type": "end"}

    # 检查当前方案是否需要调用此节点
    nodes_to_call = current_solution.get("content", {}).get("nodes_to_call", [])
    if "cpu_node" in nodes_to_call:
        print("根据解决方案，开始分析CPU相关问题...")

        # 构建CPU节点的提示词
        cpu_prompt = f"""
        你是一个专门处理CPU性能问题的智能运维助手。

        你收到了以下来自boss节点的解决方案：
        {json.dumps(current_solution, indent=2, ensure_ascii=False)}

        请分析这个解决方案中与CPU相关的内容，并决定：
        1. 是否需要执行CPU相关的工具
        2. 如果需要，应该按什么顺序执行哪些工具
        3. 对每个工具执行的预期结果

        可用的CPU工具包括：
        - cpu_tool_1: CPU性能检测工具
        - cpu_tool_2: CPU负载分析工具

        请用JSON格式回复，包含：
        - should_execute: 是否需要执行工具 (true/false)
        - tools_to_execute: 需要执行的工具列表
        - execution_plan: 执行计划描述
        """

        # 调用LLM分析
        try:
            llm_response = llm.invoke(cpu_prompt)
            print(f"CPU节点LLM分析结果: {llm_response}")

            # 解析LLM响应（这里简化处理，实际应该解析JSON）
            if "true" in llm_response.lower() or "cpu" in llm_response.lower():
                print("LLM决定执行CPU工具...")

                # 获取需要调用的工具
                tools_required = current_solution.get("content", {}).get("tools_required", {}).get("cpu_node", [])

                for tool_name in tools_required:
                    if tool_name == "cpu_tool_1":
                        result = cpu_tool_1()
                        print(f"执行{tool_name}: {result}")
                    elif tool_name == "cpu_tool_2":
                        result = cpu_tool_2()
                        print(f"执行{tool_name}: {result}")

                print("CPU节点处理完成")
            else:
                print("LLM决定不执行CPU工具")

        except Exception as e:
            print(f"CPU节点LLM调用失败: {e}")


        # 检查是否还有其他节点需要调用
        # 举例：> nodes_to_call = ["cpu_node", "mem_disk_node", "log_node"]
        #     > remaining_nodes = ["mem_disk_node", "log_node"]
        remaining_nodes = [node for node in nodes_to_call if node != "cpu_node"]
        if remaining_nodes:
            return {"type": remaining_nodes[0]}
        else:
            return {"type": "end"}
    else:
        print("当前方案不需要调用CPU节点")
        return {"type": "end"}